package com.msb.singleton;

/**
 * @author: xw
 * @create: 2022/5/7 10:16
 * @description: 线程安全的单例模式  懒汉模式不占用多余的空间
 */
public class DclSingleton {
    /**
     * volatile的作用：线程之间的可见性和禁止指令重排
     *          创建对象的过程：
     *               0 new #2 <java/lang/Object>                                    申请地址
     *              3 dup                                                                        半初始化
     *              4 invokespecial #1 <java/lang/Object.<init> : ()V>      初始化
     *              7 astore_1                                                                指向对象
     *              8 return
     * volatile 使用volatile是为了防止指令重排，因为创建对象的过程存在本初始化的状态，
     */
    private static volatile DclSingleton INSTANCE;

    private DclSingleton(){}

    public static DclSingleton getInstance(){
        if(null == INSTANCE){
            synchronized(DclSingleton.class){
                if(null == INSTANCE){
                    try {
                        Thread.sleep(1);
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                    INSTANCE = new DclSingleton();
                }
            }
        }
        return INSTANCE;
    }
}
